perm filename CURFAI.FAI[SYS,HE] blob sn#018685 filedate 1973-01-05 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00005 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001
 00002 00002	ENTRY COEF,ERROR,LOOP1,LOOP2
 00005 00003	COMPUTE LEAST SQUARES ERROR OF FIT AND RETURN
 00007 00004	GETMAX LOOP - RETURNS INDEX OF MAXIMUM DISTANCE FROM LINE
 00009 00005	CUR2 LOOP - ACCUMULATES PARTIAL SUMS
 00011 ENDMK
⊗;
ENTRY COEF,ERROR,LOOP1,LOOP2

	TITLE	CURFAI

;FAIL PROCEDURES FOR CURVE FITTER

;COMPUTE COEFFICIENTS OF AX+BY=C

COEF:	HRLZ 11,-1(17);		PICK UP ARRAY. X[1]-X[9] IN REGS 0-10
	MOVEM 12,SAV12#
	BLT 11,10
	MOVE 11,5
	FMPR 11,3
	MOVE 12,1
	FMPR 12,12
	FSBR 11,12;		S ← X[6]*X[4]-X[2]↑2
	MOVE 12,5
	FMPR 12,2
	MOVE 13,0
	FMPR 13,13
	FSBR 12,13;		Z ← X[6]*X[3]-X[1]↑2
	CAMG 12,11
	JRST L1
	MOVE 6,5;		Z>S
	FMPR 6,4
	MOVE 13,0
	FMPR 13,1
	FSBR 6,13
	FDVR 6,12;		A=X[7] ← (X[6]*X[5]-X[1]*X[2])/Z
	MOVE 7,[-1.0];		B=X[8]
	MOVE 10,0
	FMPR 10,4
	MOVE 13,1
	FMPR 13,2
	FSBR 10,13
	FDVR 10,12;		C=X[9] ← (X[1]*X[5]-X[2]*X[3])/Z
	JRST L2

L1:	MOVE 6,[-1.0];		Z≤S
	MOVE 7,5
	FMPR 7,4
	MOVE 12,0
	FMPR 12,1
	FSBR 7,12
	FDVR 7,11;		B=X[8] ← (X[6]*X[5]-X[1]*X[2])/S
	MOVE 10,4
	FMPR 10,1
	MOVE 12,0
	FMPR 12,3
	FSBR 10,12
	FDVR 10,11;		C=X[9] ← (X[5]*X[2]-X[1]*X[4])/S
L2:	HRRZ 11,-1(17);		PUT BACK ARRAY
	MOVEI 12,10(11)
	BLT 11,(12)
	MOVE 12,SAV12
	SUB 17,[XWD 2,2]
	JRST @2(17)
;COMPUTE LEAST SQUARES ERROR OF FIT AND RETURN

ERROR:	PUSH 17,-1(17);		COMPUTE COEFFICIENTS
	PUSHJ 17,COEF;		SAVES AC12
	MOVE 11,6;		COEF LEFT ARRAY IN 0-10
	FMPR 11,11;		ASQ ← X[7]↑2
	MOVE 12,7
	FMPR 12,12;		BSQ ← X[8]↑2
	FMPR 11,2
	FMPR 12,3
	FADR 11,12;		ERROR←ASQ*X[3]+BSQ*X[4]
	MOVE 12,4
	FMPR 12,7
	FMPR 12,6
	FSC 12,1
	FADR 11,12;		ERROR←ERROR+2*X[7]*X[8]*X[5]
	MOVE 12,10
	FMPR 12,12
	FMPR 12,5
	FADR 11,12;		ERROR←ERROR+X[9]↑2*X[6]
	MOVE 12,6
	FMPR 12,0
	MOVE 13,7
	FMPR 13,1
	FADR 12,13
	FMPR 12,10
	FSC 12,1
	FSBR 11,12;		ERROR←ERROR-2*X[9]*(X[7]*X[1]+X[8]*X[2])
	MOVE 1,11;		AND RETURN ERROR
	MOVE 12,SAV12
	SUB 17,[XWD 2,2]
	JRST @2(17)
;GETMAX LOOP - RETURNS INDEX OF MAXIMUM DISTANCE FROM LINE

D←←0
A←←1
B←←2
C←←3
DENOM←←4
I←←5
DSTR←←6
DEND←←7
E←←10
J←←11
M←←12
IND←←13

LOOP1:	MOVEM 12,SAV12
	HRLZI 12,-11(17);	BLT ARGUMENTS INTO 0-10
	BLT 12,E
	SETZM M;		INITIALIZE MAXIMUM DISTANCE FOR TEST
	MOVEI IND,-1(I);	SET UP INDEX INTO ARRAY D
	LSH IND,2;		WITH LIMITS [1:DEND,1:4]
	ADD IND,D
L3:	AOS I;			LOOP STARTS HERE, INCREMENT COUNT
	CAIG I,(DEND);		TEST FOR WRAP AROUND
	JRST L4
	MOVEI I,(DSTR);		SET UP I AND IND FOR DSTR+1
	MOVEI IND,-1(DSTR)
	JRST L3-2

L4:	ADDI IND,4;		INCREMENT INDEX FOR NEXT X COORD
	MOVE 14,(IND);		GET X,Y IN 14 AND 15
	MOVE 15,1(IND)
	FMPR 14,A;		COMPUTE DISTANCE FROM LINE AX+BY=C
	FMPR 15,B
	FADR 14,15
	FADR 14,C
	FDVR 14,DENOM
	MOVMS 14
	CAMG 14,M;		TEST IF GREATER THAN MAXIMUM
	JRST .+3
	MOVE M,14;		IF SO, SAVE NEW MAXIMUM FOR FUTURE TESTS
	MOVEI J,(I);			AND INDEX OF COORDINATES
	CAIE I,(E);		TEST FOR END OF LINE
	JRST L3
	MOVE 1,J;		RETURN INDEX J
	MOVE 12,SAV12
	SUB 17,[XWD 12,12]
	JRST @12(17)
;CUR2 LOOP - ACCUMULATES PARTIAL SUMS

D←←0
PT2←←7
DEND←←10
I←←11

LOOP2:	MOVEM 12,SAV12
	MOVE D,-5(17);		GET ARRAY D
	SETZM 1;		CLEAR SUM ARRAY
	MOVE 10,[XWD 1,2]
	BLT 10,6
	MOVE PT2,-3(17);	GET SOME MORE ARGUMENTS
	MOVE DEND,-2(17)
	MOVE I,-4(17)
	MOVEI 12,-1(11);	SET UP INDEX INTO D 
	LSH 12,2;		SAME COMMENTS HERE AS FOR LAST PROCEDURE
	ADD 12,D
L6:	AOS I;			INCREMENT I
	CAIG 11,(10);		TEST FOR WRAP AROUND
	JRST L7
	MOVE 11,-1(17);		AND SET POINTERS TO DSTR+1
	MOVEI 12,-1(11)
	JRST L6-2

L7:	ADDI 12,4
	MOVE 13,(12);		GET X,Y IN 13 AND 14
	MOVE 14,1(12)
	FADR 1,13;		SUM
	FADR 2,14
	MOVE 15,13
	FMPR 15,14
	FADR 5,15
	FMPR 13,13
	FMPR 14,14
	FADR 3,13
	FADR 4,14
	FADR 6,[1.0]
	CAIE PT2,(I);		CHECK FOR END IF LINE
	JRST L6
	HRR 12,-6(17);		STORE ARRAY
	HRLI 12,1
	MOVE 13,12
	BLT 12,5(13)
	MOVE 12,SAV12
	SUB 17,[XWD 7,7]
	JRST @7(17)

	END